/**
 * 
 */
package cn.biplam.common.bean.sqlengine;

import java.io.Serializable;
import java.util.ArrayList;

import cn.biplam.common.bean.Bean;
import cn.biplam.common.client.OperatorResult;
import cn.biplam.common.paramters.ModelType.Model_Type;
import cn.biplam.common.wrapper.ErrorMessage;

/**
 * ETL映射管理接口Bean
 */
public abstract class EtlMappingBean extends Bean implements Serializable{
	
	protected Model_Type type;
	
	
	/**
	 * 返回业务模型映射关系索引表名称(在各业务模型实现类中实现)
	 * @return String
	 */
	public abstract String GetMappingTableName() throws ErrorMessage;

	/**
	 * 返回目标表模型ID(用下级映射ID查询)
	 * @param mapId			ETL映射ID
	 * @return	String
	 * @throws ErrorMessage
	 */
	public abstract String GetTargetTableId(String mapId)throws ErrorMessage;

	/**
	 * 在MD中创建Select源表主表
	 * @param selectId		Select ID
	 * @param tableId		SelectTable对应的业务模型表ID
	 * @param modelType		表所在的业务模型类型
	 * @return	String	新建SelectTable记录的ID
	 */
	public abstract String CreateMasterTable(String selectId,String tableId,
			Model_Type modelType)throws ErrorMessage;

	/**
	 * 级联在MD中创建Select源表主表
	 * @param selectId		Select ID
	 * @param tableId		SelectTable对应的业务模型表ID
	 * @param modelType		表所在的业务模型类型
	 * @return	新建SelectTable记录的ID
	 * @throws ErrorMessage
	 */
	public abstract String GetCreateMasterTable(ArrayList<String> sql,String selectId,String tableId,
			Model_Type modelType)throws ErrorMessage;
	
	/**
	 * 扩展部分的创建Select源表主表,在业务管理模块实现类中实现
	 * @param sqls			SQL容器
	 * @param selectTableId	新建的SelectTable的ID
	 * @param tableId		业务模型表ID
	 * @throws ErrorMessage
	 */
	protected abstract void _CreateMasterTable(ArrayList<String> sqls,String selectTableId,
			String tableId)throws ErrorMessage;

	/**
	 * 创建关联表
	 * @param selectId			Select ID
	 * @param joinId			关联ID
	 * @param tableId			SelectTable对应的业务模型表ID
	 * @param modelType			表所在的业务模型类型
	 * @param joinSelectTableId	关联SelectTableID
	 * @return	String	新建SelectTable记录的ID
	 * @throws ErrorMessage
	 */
	public abstract String CreateJoinTable(String selectId,String joinId,
			String tableId,Model_Type modelType,
			String joinSelectTableId) throws ErrorMessage;

	/**
	 * 扩展部分的创建关联表,在业务管理模块实现类中实现
	 * @param sqls				SQL容器
	 * @param selectTableId		新建的SelectTable的ID
	 * @param tableId			SelectTable对应的业务模型表ID
	 * @param joinId			关联ID
	 * @throws ErrorMessage
	 */
	public abstract void _CreateJoinTable(ArrayList<String> sqls,String selectTableId,
			String tableId,String joinId) throws ErrorMessage;

	
	/**
	 * 在MD中删除一个Select源表
	 * @param selectTableId	SelectTable ID
	 * @param selectId		Select ID
	 * @param modelType		业务模型类型
	 * @return	String	rs.getOperatorInfo()
	 */
	public abstract String DeleteTable(String selectTableId,String selectId,
			Model_Type modelType)throws ErrorMessage;

	/**
	 * 级联MD中删除一个Select源表
	 * @param selectTableId	SelectTable ID
	 * @param selectId		Select ID
	 * @param modelType		业务模型类型
	 * @return	ArrayList
	 */
	public abstract ArrayList<String> GetDeleteTable(String selectTableId,String selectId,
			Model_Type modelType)throws ErrorMessage;
	
	/**
	 * 扩展部分的删除一个Select源表,在业务管理模块实现类中实现
	 * @param sqls			SQL容器
	 * @param selectTableId	新建的SelectTable的ID
	 * @param selectId		Select ID
	 * @throws ErrorMessage
	 */
	protected abstract void _DeleteTable(ArrayList<String> sqls,String selectTableId,
			String selectId)throws ErrorMessage;

	
	
	/**
	 * 创建一个映射字段
	 * @param selectId		Select ID
	 * @param mapId			ETL映射ID
	 * @param fieldIdList	需要添加的字段ID列表(逗号分隔)
	 * @throws ErrorMessage
	 */
	public abstract void CreateField(String selectId,String mapId,String fieldIdList)throws ErrorMessage;
	
	/**
	 * 扩展部分的创建一个映射字段(在业务管理模块实现类中实现)
	 * @param sqls			SQL容器
	 * @param mapFieldId	映射字段ID
	 * @param fieldId		业务模型字段ID
	 * @throws ErrorMessage
	 */
	public abstract void _CreateField(ArrayList<String> sqls,String mapFieldId,String fieldId)throws ErrorMessage;
	

	/**
	 * 删除一个映射字段
	 * @param mapFieldId	映射字段ID
	 * @throws ErrorMessage
	 */
	public abstract void DeleteField(String mapFieldId)throws ErrorMessage;
	
	/**
	 * 删除一个映射字段(在业务管理模块实现类中实现)
	 * @param sqls			SQL容器
	 * @param mapFieldId	映射字段ID
	 * @param fieldId		业务模型字段ID
	 * @throws ErrorMessage
	 */
	public abstract void _DeleteField(ArrayList<String> sqls,String mapFieldId,String fieldId)throws ErrorMessage;

	/**
	 * 查询属于某个映射的所有映射字段
	 * @param mapId			ETL映射ID
	 * @return	OperatorResult<BR>
	 * @throws ErrorMessage
	 */
	public abstract OperatorResult SelectAllField(String mapId) throws ErrorMessage;
	
	/**
	 * 查询单个映射字段的结果集
	 * @param mapFieldId	映射字段ID
	 * @return OperatorResult
	 * @throws ErrorMessage
	 */
	public abstract OperatorResult SelectField(String mapFieldId) throws ErrorMessage;

	/**
	 * 返回新建的实例
	 * @param userId	用户ID
	 * @param type		业务模型类型(Model_Type)
	 * @return MappingField
	 * @throws ErrorMessage
	 */
	public static EtlMappingBean getNewInstance(String userId,Model_Type type) throws ErrorMessage{
		if(type==null){
			throw new ErrorMessage("模型类型==Null.");
		}
		switch(type){
		case Src:
			return (EtlMappingBean)get("EtlMappingBeanSrc", userId);
		case Bm:
			return (EtlMappingBean)get("EtlMappingBeanBm", userId);
		default:
			throw new ErrorMessage("未支持的模型类型("+type.name()+")");
		}
	}

}
